/**
 * 数据过虑
 * @param    {Array}  data     被过滤的数组
 * @param    {Object}  filters     过虑参数对象
 */
export const dataFilter = (data, filters) => {
  // 数据过虑
  return data.filter(ele => {
    // 循环元素
    for (const key in filters) {
      // 一个元素
      const item = ele[key]
      const reg = filters[key]

      // 是否包含字段
      if (ele.hasOwnProperty(key)) {
        if (typeof item === 'string') {
          // 字符串类型
          if (item.indexOf(reg) === -1) {
            return false
          }
        } else if (typeof item === 'boolean') {
          // 布尔类型
          if (reg !== item && reg !== '') {
            return false
          }
        } else if (typeof item === 'number') {
          // 数字类型
          if (reg !== item && reg !== '') {
            return false
          }
        } else {
          // null 类型
          if (typeof reg === 'string' && ''.indexOf(reg) === -1) {
            return false
          }
          if (typeof reg === 'boolean' || typeof reg === 'number') {
            return false
          }
        }
      }
    }
    return true
  })
}

/**
 * 创建querySearch
 * @param    {Array}  data     被过滤的数组
 * @param    {String}  field   显示的字段
 */
export const generateQuerySearch = (data, field) => {
  return (queryString, cb) => {
    var results = queryString
      ? dataFilter(data, { [field]: queryString })
      : data
    results = results.map(ele => {
      return { value: ele[field] }
    })
    // 调用 callback 返回建议列表的数据
    cb(results)
  }
}

/**
 * 数字格式化
 * @param    {Number}  val     需格式化的数字
 * @param    {Number}  precision  精度
 */
export const formatNumber = (val, precision = 2) => {
  // 精度0 - 10 位
  precision = precision > 0 && precision <= 10 ? precision : 2
  val = parseFloat((val + '').replace(/[^\d\.-]/g, '')).toFixed(precision) + ''
  // 左右
  const [left, right] = val.split('.')
  // 整数数组
  const leftArr = left.split('').reverse()
  // 累加
  const result = leftArr
    .reduce((pre, cur, ind, arr) => {
      return pre + ((ind + 1) % 3 === 0 ? ',' : '') + cur
    }, '')
    .split('')
    .reverse()
    .join('')

  return result + '.' + right
}

/**
 * 数字百分比
 * @param    {Number}  val     需格式化的数字
 * @param    {Number}  precision      精度
 */
export const formatPercent = (val, precision = 2) => {
  if (!val) return '0'
  return (val * 100).toFixed(precision)
}

/**
 * 获取随机数
 * @param    {Number}  start    开始(包括)
 * @param    {Number}  end      结束(包括)
 */
export const getRandom = (start = 0, end = 100) => {
  const random = Math.floor(Math.random() * (end - start + 1)) + start
  return random
}

/**
 * 二进制响应解析
 */

export const binaryParser = async response => {
  return new Promise((resolve, reject) => {
    let resData = ''
    // 文件名
    let fileName
    const disposition = response.headers['content-disposition']
    if (disposition) {
      fileName = /filename=\"([^\"\']*)\"/.exec(disposition) && /filename=\"([^\"\']*)\"/.exec(disposition)[1]
    }
    // 数据
    const blob = response.data
    fileName = window.decodeURIComponent(fileName)
    if (!fileName) {
      const errorData = new FileReader()
      errorData.addEventListener('loadend', function (data) {
        try {
          resData = JSON.parse(data.target.result)
        } catch (e) {
          resData = ''
        }
        resolve(resData)
      })
      errorData.readAsText(blob)
    } else {
      const reader = new FileReader()
      reader.readAsDataURL(blob)
      reader.onload = e => {
        const aEl = document.createElement('a')
        aEl.download = fileName
        aEl.href = e.target.result
        document.body.appendChild(aEl)
        aEl.click()
        document.body.removeChild(aEl)
        resolve({
          code: '0000',
          message: '成功'
        })
      }
    }
  })
}
